'use strict';
const JSEncrypt = require('node-jsencrypt');
const Controller = require('egg').Controller;
// 默认返回的用户基本信息字段
const { USER_DEFAULT_MODEL } = require('../../utils/common');
const { generateToken } = require('../../utils/token.js');

class LoginController extends Controller {
	async login(ctx) {
		const { content } = ctx.request.body;
		const { app } = this;

		// 通过jsEncrypt进行解密
		const jsEncrypt = new JSEncrypt();
		// 设置私钥
		jsEncrypt.setPrivateKey(app.config.private_key);
		// 私钥解密用户信息
		let _content = jsEncrypt.decrypt(content);
		if (!_content) {
			ctx.failure(1, '验证失败！');

			return;
		}
		// 转换成JSON格式
		let jsonContent = JSON.parse(_content);
		const { username, password } = jsonContent;
		let user = await this.ctx.model.User.findOne({
			attributes: [...USER_DEFAULT_MODEL, 'secPassword'],
			where: {
				username
			}
		});
		// 根据用户名没有查询到此用户
		if (!user) {
			ctx.failure(2, '用户不存在');
			return;
		}

		// 如果查询到此用户，那么就去验证此用户的密码是否正确
		if (!user.secPassword || user.secPassword !== password) {
			ctx.failure(null, '用户名或者密码错误', 3);
			return;
		}
		// token的有效期时间,默认为1天
		const tokenTime = 3600 * 24;
		// 根据id生成当前用户登录的token
		const token = generateToken(
			JSON.stringify({
				username: user.username,
				id: user.id
			}),
			tokenTime
		);
		console.log(token);

		// 在header上保存用户的token信息
		this.ctx.response.header.token = token;
		//保存到客户端浏览器的cookie中
		ctx.cookies.set('token', token, {
			maxAge: tokenTime * 1000,
			path: '/',
			httpOnly: false
		});
		// 保存到redis
		app.redis.set(token, JSON.stringify(user));

		this.ctx.success(
			{
				token: token,
				user
			},
			'登录成功!'
		);
	}

	/**
	 * 根据 token 获取用户的基本信息
	 *
	 */
	async getUserInfoByToken() {
		let { token } = this.ctx.request.body;
		let { ctx, app } = this;
		if (!token) {
			// 没有token则表示未登录
			ctx.failure(1, '未登录');
			return;
		}
		console.log(token);
		const user = await app.redis.get(token);
		if (!user) {
			// 根据用户名没有查询到此用户
			ctx.failure(1, '查询用户信息失败');
			return;
		}
		console.log(JSON.parse(user));
		// 返回用户的信息
		this.ctx.success(JSON.parse(user));

	}
}

module.exports = LoginController;
